package util;

import DAO.MyDrawPane;
import DAO.NodeList;
import javafx.scene.image.WritableImage;
import javafx.scene.transform.Scale;

/**
 * 对界面进行放大缩小对界面进行放大缩小
 */
public class Zoom {
	
	public static int count=0;

	/**
	 * 为MyDrawPane的drawPane设置滚动事件处理
	 */
	public static void zoom() {
		// 设置滚动事件的处理逻辑
		MyDrawPane.drawPane.setOnScroll(event -> {
			// 检查是否按下了Ctrl键
			if (event.isControlDown()) {
				double deltaY = event.getDeltaY();
				// 当滚动向上时，放大画布
				if(event.getDeltaY()>0) {
					enlarge();
				}
				// 当滚动向下时，缩小画布
				if(event.getDeltaY()<0) {
					reduce();
				}
			}
		});
	}

	/**
	 * 放大当前绘制窗口的视图
	 */
	public static void enlarge() {
		// 如果当前计数小于8，则执行放大逻辑
		if(count<8) {
			count++;
			// 向当前图形上下文添加一个放大变换
			MyDrawPane.g.getTransforms().add(new Scale(1.1,1.1,MyDrawPane.drawPane.getWidth()/2,MyDrawPane.drawPane.getHeight()/2));

			// 创建一个新图像，以反映变换后的视图尺寸
			WritableImage wi1 = MyDrawPane.g.snapshot(null, null);
			// 根据新图像的大小，调整绘制面板的大小
			double width = 1000 + wi1.getWidth()*2;
			double height = 1000+ wi1.getHeight();
			MyDrawPane.drawPane.setPrefWidth(width);
			MyDrawPane.drawPane.setPrefHeight(height);

			// 重绘当前场景
			MyDrawPane.redraw();
			// 尝试更新相关的树视图
			try {
				MyTreeView.setTreeView();
			} catch (Exception e6) {
				// 打印异常堆栈信息
				e6.printStackTrace();
			}
		}
	}

	/**
	 * 执行画布的缩小操作
	 */
	public static void reduce() {
		// 如果计数器大于-8，则执行缩放和UI更新逻辑
		if(count>-8) {
			count--;
			// 应用缩小变换，缩放中心为画布的中心点
			MyDrawPane.g.getTransforms().add(new Scale(0.9,0.9,MyDrawPane.drawPane.getWidth()/2,MyDrawPane.drawPane.getHeight()/2));

			// 捕获当前画布的图像，并根据图像大小调整画布的首选尺寸
			WritableImage wi1 = MyDrawPane.g.snapshot(null, null);
			double width = 1000 + wi1.getWidth()*2;
			double height = 1000+ wi1.getHeight();
			MyDrawPane.drawPane.setPrefWidth(width);
			MyDrawPane.drawPane.setPrefHeight(height);

			// 调用重绘方法以应用最新的画布尺寸和变换
			MyDrawPane.redraw();
			// 尝试更新TreeView组件，如果失败则打印异常
			try {
				MyTreeView.setTreeView();
			} catch (Exception e7) {
				e7.printStackTrace();
			}
		}
	}

	/**
	 * 这个方法用于恢复画布和树视图到初始状态
	 * 它重置绘制计数，清除图形的变换，重新定位节点，重绘画布，并更新树视图
	 */
	public static void recover() {
		// 重置绘制计数器
		count=0;
		// 清除图形的变换数组
		MyDrawPane.g.getTransforms().clear();
		// 重新定位所有节点的X坐标
		NodeLocatorUtil.locateX(NodeList.getRoot());
		// 重新定位所有节点的Y坐标
		NodeLocatorUtil.locateY(NodeList.getRoot());
		// 重绘画布
		MyDrawPane.redraw();
		try {
			// 尝试更新树视图
			MyTreeView.setTreeView();
		} catch (Exception e8) {
			// 如果更新树视图时发生异常，打印异常栈信息
			e8.printStackTrace();
		}
	}
}
